package com.atbun.aclservice.service.impl;

import com.atbun.aclservice.entity.AclRole;
import com.atbun.aclservice.entity.AclRolePermission;
import com.atbun.aclservice.entity.AclUserRole;
import com.atbun.aclservice.mapper.RoleMapper;
import com.atbun.aclservice.service.RolePermissionService;
import com.atbun.aclservice.service.RoleService;
import com.atbun.aclservice.service.UserRoleService;
import com.atbun.commonutils.R;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.poi.hssf.record.DVALRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author testjava
 * @since 2020-05-23
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, AclRole> implements RoleService {

    @Autowired
    private UserRoleService userRoleService;

    @Autowired
    private RolePermissionService rolePermissionService;

    /**
     * 根据角色id删除角色
     * 思路：
     *      如果当前角色有用户正在使用，则不能删除，
     *      如果当前角色与菜单有关联，可以删除，但是注意，删除该角色时，角色与菜单关联表的当前角色数据也应该删除
     * @param roleId
     * @return
     */
    @Override
    public R removeRole(String roleId) {
//        1、判断该角色是否有用户在使用(查找用户角色表)
        int count = userRoleService.count(new QueryWrapper<AclUserRole>().eq("role_id", roleId));
        if (count > 0){ //如果查找的记录大于0，说明有用户正在使用该角色
            return R.error().message("该角色有用户正在使用");
        }
//        2、删除角色菜单表中的信息
        boolean remove = rolePermissionService.remove(new QueryWrapper<AclRolePermission>().eq("role_id", roleId));
        if (remove){
            return R.ok();
        }
        return R.error().message("删除该角色失败");
    }

    /**
     * 根据用户id获取角色数据
     * 返回结果包含当前用户下的角色与所有角色信息
     * @param userId
     * @return
     */
    @Override
    public Map<String, Object> findRoleByUserId(String userId) {
//        查询所有角色
        List<AclRole> allRolesList = this.baseMapper.selectList(null);
//        根据用户id查询用户拥有的角色
        List<AclUserRole> existUserRoleList = userRoleService.list(new QueryWrapper<AclUserRole>().eq("user_id", userId).select("role_id"));
//        遍历用户角色
        List<String> existRoleList = existUserRoleList.stream().map(c -> c.getRoleId()).collect(Collectors.toList());
//        对角色进行分类
        List<AclRole> assignRoles = new ArrayList<>();
//        遍历所有角色，如果角色id与用户拥有的角色id相同，就存放在该用户下
        for (AclRole role : allRolesList){
//            已分配角色
            if (existRoleList.contains(role.getId())){
                assignRoles.add(role);
            }
        }
        Map<String, Object> roleMap = new HashMap<>();
        roleMap.put("assignRoles", assignRoles);
        roleMap.put("allRolesList", allRolesList);
        return roleMap;
    }

    /**
     * 根据用户分配角色
     * 需求：1、为了避免重复添加该用户角色，先把该用户下面的角色删除
     *      2、使用新建的集合盛放要添加的角色
     *      3、使用新建的集合盛放要添加的角色
     * @param userId
     * @param roleIds
     */
    @Override
    public void saveUserRoleRealtionShip(String userId, String[] roleIds) {
//        1、删除该用户下的角色
        QueryWrapper<AclUserRole> aclUserRole = new QueryWrapper<>();
        aclUserRole.eq("user_id", userId);
        if (null != aclUserRole){
            this.userRoleService.remove(aclUserRole);
        }
//        2、使用新建的集合盛放要添加的角色
        List<AclUserRole> list = new ArrayList<>();
        for (String roleId : roleIds){
            AclUserRole userRole = new AclUserRole();
            userRole.setRoleId(roleId);
            userRole.setUserId(userId);
            list.add(userRole);
        }
//       3、使用新建的集合盛放要添加的角色
        this.userRoleService.saveBatch(list);
    }
}
